/**
  * @file Algorithm.h
  * @author Thibault Merle et Guillaume Poussel
  */
#ifndef ALGORITHM_H
#define ALGORITHM_H

#include "base/Point.h"
#include "base/point_list.h"

/**
  * @brief Classe de base pour tous les algorithmes de détermination
  * d'enveloppe convexe.
  */
class Algorithm {
private:
    /**
      * Détermine si on applique ou non l'optimisation du losange.
      */
    bool _with_opti;

protected:
    /**
      * Calcule l'enveloppe convexe d'un ensemble de points
      * @param points Liste des points en entrée
      * @return Liste des points constituant l'enveloppe convexe
      */
    virtual point_list compute(point_list points) = 0;

public:
    Algorithm() : _with_opti(false) {} ;
    /**
      * Détermine l'enveloppe convexe d'un ensemble de points. Cette méthode
      * applique éventuellement l'optimisation du losange avant d'appeller
      * la méthode #compute.
      * @param points Liste des points en entrée
      * @return Liste des points constituant l'enveloppe convexe
      */
    point_list compute_hull(point_list points);

    /**
      * Change la façon dont on applique l'optimisation du losange.
      * @param with_opti Indique si l'on doit appliquer l'optimisation
      */
    void with_diamond_opti(bool with_opti) {
        _with_opti = with_opti;
    }

};

#endif // ALGORITHM_H
